iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Mobile Development

swift 30天之旅系列 第 12

第十二天:Swift進階 - 泛型

  • 分享至 

  • xImage
  •  

Swift的設計不僅注重效能和安全性,還包括一些強大的語言特性,使得程式碼更加直觀和可重用。泛型就是Swift中一個重要的特性,它允許我們寫出靈活、可重用的函數和類型,而不失去類型的安全性。

泛型 是什麼?

泛型可以讓你寫出一個可以工作於多種類型的函數或結構,而不需要重複地寫代碼。換句話說,你可以用一個方法來定義、呼叫和使用,而不管其支持的具體數據類型是什麼。

為什麼使用泛型?

想像一下,如果你需要編寫一個交換兩個整數值的函數,可能會像這樣:

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

但是,如果你想交換兩個字符串或其他類型的值呢?不使用泛型,你可能需要為每一種數據類型寫一個交換函數。這種方法不僅重複且不可維護,還容易出錯。

泛型提供了一個更好的解決方案。

如何使用泛型?

你可以使用尖括號(<>)來定義泛型函數或類型。

使用上面的交換函數為例,我們可以使用泛型來重寫它:

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

在這裡,T是一個泛型占位符,代表任何類型。現在,你可以使用這個函數來交換任意類型的兩個值,只要它們是同一類型。

泛型類型

除了函數,你還可以定義泛型類型。Swift的Array和Dictionary就是泛型集合的典型例子。

例如,以下是一個泛型堆疊(Stack)的結構:

struct Stack<Element> {
    var items = [Element]()
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element? {
        return items.popLast()
    }
}

這個Stack可以用於任何類型,例如Int或String。

泛型的限制

有時,你可能需要對泛型施加某些限制。例如,可能只希望某個泛型函數接受遵循某個協議的類型。Swift允許你添加這些限制。

例如,以下函數只接受遵循Comparable協議的類型:

func findIndex<T: Comparable>(of valueToFind: T, in array:[T]) -> Int? {
    for (index, value) in array.enumerated() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

總結

泛型是Swift中強大的一個特性,它允許開發者編寫靈活且可重用的代碼,而不會失去類型的安全性。泛型不僅僅限於上述的使用情景,它還有更多的應用和特性,例如泛型where子句、關聯類型等。隨著Swift的發展和你對其的深入學習,你會發現泛型提供了很多優雅和強大的解決方案,對於高效的Swift程式設計至關重要。


上一篇
第十一天:Swift進階 - 閉包
下一篇
第十三天:Swift 進階 - 模式匹配
系列文
swift 30天之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言